package com.twq.types.abstracttype

/**
 * Created by tangweiqun on 2017/11/19.
 */
object TypeCreation {
  def main(args: Array[String]): Unit = {
    println()

    val map: Map[Int, Int] = Map(1 -> 2)
  }

  //2、类型的引用
  //2.1、对于class或者trait，我们通过名字来引用类型
  def foo(x: ClassName) = x

  def bar(x: TraitName) = x

  //2.2、对于object，我们需要通过object中的type成员来引用对象类型
  //这个语法在scala中是不常见的，因为你都已经知道了对象的名字，可以直接通过名字访问对象
  def baz(): ObjectName.type = ObjectName

  foo(new ClassName)

  //baz(ObjectName)
}

//1、通过class、trait和object来定义类型
class ClassName

trait TraitName

object ObjectName


//3、使用type来定义类型，必须包含在class、trait或者object的上下文中定义
object TypeDefines {
  //3.1、定义具体的类型
  type ConcreteType1 = Int //也可以称作为type alias即类型别名
  type ConcreteType2 = Int with Ordering[Int]

  //4、类型的引用
  def foz(x: ConcreteType1) = x

  def foc(x: ConcreteType2) = x

  foz(1)


}

//3.2、定义一个抽象类型
trait TypeTrait {
  type AbstractType
  val t: Int

  def test(): Unit
}

class TypeDefines extends TypeTrait {
  //继承trait中的抽象类型并使之具体化
  type AbstractType = Int
  val t = 2

  override def test(): Unit = ???
}

